package to.pm.acquisti.ejb;

import java.util.LinkedList;
import java.util.List;
import java.util.logging.Logger;
import javax.annotation.Resource;
import javax.ejb.Stateful;
import javax.jms.ConnectionFactory;
import javax.jms.Queue;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import to.pm.acquisti.core.GestioneOrdine;
import to.pm.acquisti.core.NotificaOrdineEsterno;
import to.pm.ejb.EjbName;
import to.pm.entity.acquisti.DOECategoria;
import to.pm.entity.acquisti.DOEProdotto;
import to.pm.entity.acquisti.DettaglioOrdineEsterno;
import to.pm.entity.acquisti.Fornitore;
import to.pm.entity.acquisti.OrdineEsterno;
import to.pm.entity.catalogo.Categoria;
import to.pm.entity.catalogo.Prodotto;
import to.pm.entity.magazzino.DettaglioRicezione;
import to.pm.entity.magazzino.Ricezione;


@Stateful(name=EjbName.OrdineEsternoBean, mappedName=EjbName.OrdineEsternoBean)
public class OrdineBean 
        implements to.pm.acquisti.bi.GestioneOrdineBusiness {

    Logger log = Logger.getAnonymousLogger();

    private EntityManager em;

    private GestioneOrdine ordine ;

    private Fornitore fornitore ;

    private String numeroOrdineInterno;

    private LinkedList<DettaglioOrdineEsterno> dettagli;
            
    private NotificaOrdineEsterno notifica = new NotificaOrdineEsterno();;

    private OrdineEsterno ordineEsterno;

    public void iniziaOrdine(){
        ordine = new GestioneOrdine();
        ordine.setEm(em);
        fornitore = null;
        dettagli = new LinkedList<DettaglioOrdineEsterno>();
    }

    private OrdineEsterno createOrdineEsterno(Fornitore f, List<DettaglioOrdineEsterno> d, String numeroOrdine) {
        OrdineEsterno o = ordine.addOrdineEsterno(f, d, numeroOrdine);
        notifica.setMessage(o);
        notifica.send();
        return o;
    }

    public void setNumeroOrdineInterno(String numeroOrdineInterno) {
        this.numeroOrdineInterno = numeroOrdineInterno;
    }



    @PersistenceContext
    public void setEm(EntityManager em){
        this.em = em;
    }

    @Resource(mappedName = "jms/ConnectionFactory")
    public void setConnectionFactory(ConnectionFactory connectionFactory) {
        notifica.setConnectionFactory(connectionFactory);
    }

    @Resource(mappedName = "jms/QOrdineEsterno")
    public void setQueueNotifica(Queue queueNotifica) {
        notifica.setQueue(queueNotifica);
    }

    public void associaFornitore(Fornitore f) {
        fornitore = f;
    }

    public void aggiungiDettaglio(DettaglioOrdineEsterno o) {
        dettagli.add(o);
    }

    public OrdineEsterno confermaOrdine() {
       ordineEsterno =  this.createOrdineEsterno(fornitore, dettagli, numeroOrdineInterno);
       fornitore = null;
       dettagli = null;
       numeroOrdineInterno = null;
       return ordineEsterno;
    }

    public OrdineEsterno setInRicezione() {
        return ordine.setStatoInRicezione(ordineEsterno);
    }

    public OrdineEsterno loadOrdineEsterno(OrdineEsterno oid) {
        ordineEsterno = em.find(oid.getClass(), oid.getId());
        return ordineEsterno;
    }

    public OrdineEsterno recuperaInfo(OrdineEsterno oe) {
        oe = em.getReference(OrdineEsterno.class, oe.getId());
        log.info("OrdineEsterno: "+oe);
        for(DettaglioOrdineEsterno d : oe.getDettaglio()) {
            d = em.getReference(DettaglioOrdineEsterno.class, d.getId());
            log.info("DettaglioOrdineEsterno: "+d);
            if (d.getIsProdotto()) {
                em.getReference(Prodotto.class, ((DOEProdotto)d).getProdotto().getId());
            } else {
                em.getReference(Categoria.class, ((DOECategoria)d).getCategoria().getId());
            }
            for (DettaglioRicezione dr: d.getDettaglioRicezioni()) {
                dr = em.getReference(DettaglioRicezione.class, dr.getId());
                log.info("DettaglioRicezione: "+dr);
            }

        }


        oe = em.getReference(OrdineEsterno.class, oe.getId());
        log.info("OrdineEsterno: "+oe);
        for(Ricezione r:oe.getRicezioniOrdine()){
            r = em.getReference(Ricezione.class, r.getId());
            log.info("Ricezione: "+r);
            for (DettaglioRicezione dr: r.getDettaglio()) {
                dr = em.getReference(DettaglioRicezione.class, dr.getId());
                log.info("DettaglioRicezione: "+dr);                
            }
        }


        return oe;
    }

}
